precision mediump float;

varying vec3 vNormal;
varying vec3 vPos;

// 矩阵
uniform mat4 viewMatrix;
uniform mat4 mvMatrix;

// 环境光
uniform vec3 ambientColor;

// 方向光
uniform vec3 lightDir;
uniform float dirLightIntensity;

// 镜面光
uniform float shiness;

// 棋盘着色器
void main() {
    vec3 color = vec3(1.0, 1.0, 1.0);

    vec4 posInV = mvMatrix * vec4(vPos, 1.0);

    // 相机空间中 光方向
    vec3 lightDirInV = normalize((viewMatrix * vec4(lightDir, 0.0)).xyz);

    // 相机空间中的 法线
    vec3 normalInV = normalize((mvMatrix * vec4(vNormal, 0.0)).xyz);
    float diffuse = max(0.0,dot(normalInV,lightDirInV));
    vec3 vDiffuseColor = dirLightIntensity * diffuse * vec3(1.0,1.0,1.0);

    // 计算镜面光
    vec3 posToCamera = normalize(-posInV.xyz);
    vec3 refLight = normalize(reflect(-lightDirInV,normalInV));
    float spec = max(0.0,dot(refLight,posToCamera));
    if(spec > 0.0){
        spec = pow(spec,shiness);
    }
    vec3 vSpecColor = spec * vec3(1.0,1.0,1.0);


    gl_FragColor = vec4((ambientColor + vDiffuseColor + vSpecColor) * color, 1.0);
}
